#!/usr/bin/env python3
"""
从PDF markdown源文件中提取所有案例的Stata代码
按章节组织到独立的do文件中
"""

import re
import os

# 读取markdown文件
with open('course/MBA工商管理回归分析教程_代码集成版.md', 'r', encoding='utf-8') as f:
    content = f.read()

# 定义案例信息
cases = [
    {
        'name': 'case01_salary_analysis',
        'title': '案例1：员工薪酬影响因素分析',
        'part': 'part1_basics',
        'part_name': '第一部分：回归分析基础'
    },
    {
        'name': 'case02_house_price_prediction',
        'title': '案例2：房地产价格预测',
        'part': 'part1_basics',
        'part_name': '第一部分：回归分析基础'
    },
    {
        'name': 'case03_sales_forecasting',
        'title': '案例3：零售销售额预测（Lasso回归）',
        'part': 'part2_regularization',
        'part_name': '第二部分：正则化回归'
    },
    {
        'name': 'case04_fifa_player_value',
        'title': '案例4：足球运动员价值预测（随机森林+SHAP可解释性分析）',
        'part': 'part2_regularization',
        'part_name': '第二部分：正则化回归'
    },
    {
        'name': 'case05_pricing_strategy',
        'title': '案例5：产品定价策略分析',
        'part': 'part3_advanced',
        'part_name': '第三部分：高级回归技术'
    },
    {
        'name': 'case08_customer_lifetime_value',
        'title': '案例8：客户生命周期价值预测',
        'part': 'part4_comprehensive',
        'part_name': '第四部分：综合应用'
    }
]

# 提取代码块的正则表达式
def extract_code_block(content, case_title):
    """提取特定案例的代码块"""
    # 查找案例标题后的第一个```stata代码块
    pattern = rf'{re.escape(case_title)}.*?```stata\n(.*?)```'
    match = re.search(pattern, content, re.DOTALL)
    if match:
        return match.group(1)
    return None

# 创建输出目录
os.makedirs('do/cases_by_chapter/part1_basics', exist_ok=True)
os.makedirs('do/cases_by_chapter/part2_regularization', exist_ok=True)
os.makedirs('do/cases_by_chapter/part3_advanced', exist_ok=True)
os.makedirs('do/cases_by_chapter/part4_comprehensive', exist_ok=True)

print("=" * 80)
print("从PDF提取案例代码")
print("=" * 80)
print()

# 提取每个案例的代码
extracted_count = 0
for case in cases:
    print(f"正在提取: {case['title']}")
    
    # 提取代码
    code = extract_code_block(content, case['title'])
    
    if code:
        # 保存到文件
        output_path = f"do/cases_by_chapter/{case['part']}/{case['name']}.do"
        with open(output_path, 'w', encoding='utf-8') as f:
            f.write(code)
        
        # 统计行数
        line_count = len(code.split('\n'))
        file_size = len(code.encode('utf-8'))
        
        print(f"  ✓ 已保存: {output_path}")
        print(f"    行数: {line_count}")
        print(f"    大小: {file_size:,} 字节")
        extracted_count += 1
    else:
        print(f"  ✗ 未找到代码块")
    
    print()

print("=" * 80)
print(f"提取完成: {extracted_count}/{len(cases)} 个案例")
print("=" * 80)
print()

# 创建README文件
readme_content = """# MBA工商管理回归分析教程 - 案例代码

本目录包含教程中所有案例的完整Stata代码，按章节组织。

## 📁 目录结构

```
do/cases_by_chapter/
├── part1_basics/              # 第一部分：回归分析基础
│   ├── case01_salary_analysis.do
│   └── case02_house_price_prediction.do
├── part2_regularization/      # 第二部分：正则化回归
│   ├── case03_sales_forecasting.do
│   └── case04_fifa_player_value.do
├── part3_advanced/            # 第三部分：高级回归技术
│   └── case05_pricing_strategy.do
└── part4_comprehensive/       # 第四部分：综合应用
    └── case08_customer_lifetime_value.do
```

## 📊 案例列表

### 第一部分：回归分析基础

#### 案例1：员工薪酬影响因素分析
- **文件**: `part1_basics/case01_salary_analysis.do`
- **难度**: ⭐⭐ 初级
- **技术**: 线性回归、模型诊断、非线性关系
- **数据**: nlswork.dta (美国国家纵向调查)

#### 案例2：房地产价格预测
- **文件**: `part1_basics/case02_house_price_prediction.do`
- **难度**: ⭐⭐ 初级
- **技术**: 多元回归、交互项、对数变换
- **数据**: housing.dta (房地产数据)

### 第二部分：正则化回归

#### 案例3：零售销售额预测（Lasso回归）
- **文件**: `part2_regularization/case03_sales_forecasting.do`
- **难度**: ⭐⭐⭐ 中级
- **技术**: Lasso回归、变量选择、交叉验证
- **数据**: retail_sales.dta (零售数据)

#### 案例4：足球运动员价值预测（随机森林+SHAP）
- **文件**: `part2_regularization/case04_fifa_player_value.do`
- **难度**: ⭐⭐⭐⭐ 高级
- **技术**: 随机森林、GBM、SHAP可解释性分析
- **数据**: fifa2023.dta (FIFA球员数据)

### 第三部分：高级回归技术

#### 案例5：产品定价策略分析
- **文件**: `part3_advanced/case05_pricing_strategy.do`
- **难度**: ⭐⭐⭐⭐ 高级
- **技术**: H2O GBM、SHAP、价格弹性分析
- **要求**: Stata 19 + H2O框架

### 第四部分：综合应用

#### 案例8：客户生命周期价值预测
- **文件**: `part4_comprehensive/case08_customer_lifetime_value.do`
- **难度**: ⭐⭐⭐⭐⭐ 专家级
- **技术**: H2O GBM、客户细分、CLV预测
- **要求**: Stata 19 + H2O框架

## 🚀 运行方式

### Stata 18 (传统方法)

```bash
# 案例1-3
stata-se -b do do/cases_by_chapter/part1_basics/case01_salary_analysis.do
stata-se -b do do/cases_by_chapter/part1_basics/case02_house_price_prediction.do
stata-se -b do do/cases_by_chapter/part2_regularization/case03_sales_forecasting.do
```

### Stata 19 (H2O方法)

```bash
# 案例4-8 (需要H2O框架)
stata-mp -b do do/cases_by_chapter/part2_regularization/case04_fifa_player_value.do
stata-mp -b do do/cases_by_chapter/part3_advanced/case05_pricing_strategy.do
stata-mp -b do do/cases_by_chapter/part4_comprehensive/case08_customer_lifetime_value.do
```

## 📋 前置要求

### 所有案例
- Stata 18 或更高版本
- 网络连接（用于下载数据）

### 案例4-8 (H2O案例)
- Stata 19
- H2O框架已安装
- Java 8 或更高版本

### 安装H2O (Stata 19)

```stata
* 安装H2O包
ssc install h2o

* 初始化H2O集群
h2o init

* 检查H2O状态
h2o status
```

## 📂 输出文件

每个案例运行后会生成：

- **日志文件**: `output/caseXX_*.log`
- **图表文件**: `output/figures/caseXX_*.png`
- **结果文件**: `output/caseXX_results.dta` (部分案例)

## 💡 使用建议

1. **按顺序学习**: 建议从案例1开始，逐步深入
2. **理解代码**: 每个do文件都有详细注释，建议逐行理解
3. **修改参数**: 尝试修改参数，观察结果变化
4. **对比结果**: 将运行结果与PDF中的结果对比

## 📚 参考资料

- **教程PDF**: `course/MBA工商管理回归分析教程_代码集成版.pdf`
- **Stata手册**: https://www.stata.com/manuals/
- **H2O文档**: https://docs.h2o.ai/

## 🆘 常见问题

### Q1: 数据文件找不到？
A: 大部分案例使用在线数据，确保网络连接正常。

### Q2: H2O初始化失败？
A: 检查Java版本，确保Stata 19已正确安装H2O包。

### Q3: 图表无法生成？
A: 确保`output/figures/`目录存在，或修改代码中的路径。

---

**作者**: 张立强  
**版本**: 1.0  
**日期**: 2025-11-03
"""

with open('do/cases_by_chapter/README.md', 'w', encoding='utf-8') as f:
    f.write(readme_content)

print("✓ 已创建 README.md")
print()
print("所有文件已保存到: do/cases_by_chapter/")

